/**
 在TypeScript中，索引签名（Index Signature）用于定义具有动态属性的对象类型。通过索引签名，可以创建一个对象，其属性名不固定，但属性值的类型是确定的。
  1. 定义索引签名
  - 索引签名的基本语法是使用方括号  `[]`  来定义属性名的类型，后面跟着属性值的类型。
  - 可以使用字符串或数字作为索引。

  2. 字符串索引签名
  - 当索引是字符串类型时，可以定义一个对象，它的所有属性名都是字符串，属性值的类型是统一的。
  - 例如：
  interface StringDictionary {
      [key: string]: string; // 属性名为字符串，属性值为字符串
  }

  const myDict: StringDictionary = {
      name: "张三",
      age: "30", // 这里 age 的值也必须是字符串
  };
  3. 数字索引签名
  - 数字索引签名用于定义一个对象，其属性名是数字类型。
  - 例如：
  interface NumberArray {
      [index: number]: number; // 属性名为数字，属性值为数字
  }

  const myArray: NumberArray = [1, 2, 3, 4]; // 合法
  const first: number = myArray[0]; // 合法
  4. 混合索引签名
  - 可以同时定义字符串和数字索引签名，但要注意，数字索引签名的返回值类型必须是字符串索引签名返回值类型的子类型。
  - 例如：
  interface MixedDictionary {
      [key: string]: string; // 字符串索引
      [index: number]: number; // 数字索引
  }

  const mixed: MixedDictionary = {
      0: 100,
      name: "李四",
  }; // 合法
  5. 使用索引签名的场景
  - 索引签名常用于定义动态属性的对象，例如字典、映射等数据结构。
  - 在处理未知数量的属性时，索引签名非常有用。

  6. 注意事项
  - 索引签名的属性值类型必须统一，不能混合不同类型。
  - 如果定义了字符串索引签名，则不能再定义与之相矛盾的属性类型。

  7. 总结
  索引签名是TypeScript中一个强大而灵活的特性，允许开发者定义具有动态属性的对象类型。通过使用索引签名，可以有效地处理不确定的属性名，并确保属性值的类型一致性。这为构建复杂的数据结构提供了便利，提高了代码的可读性和可维护性。
 */
interface ICollection {
  [index: string]: number; // 索引签名
  length: number;
}

const names: number[] = [1, 2, 3, 4, 5];
console.log(names[0]);
console.log(names.length);

function iteratorCollection(collection: ICollection) {
  console.log(collection[0])
  console.log(collection[1])
}

// iteratorCollection(names)// 报错
const tuple: [string, string] = ["name-index", "18"]
// iteratorCollection(tuple) // 报错
iteratorCollection({ name: 111, age: 18, length: 10 })

// 索引签名-索引类型问题(忽略)
interface IIndexType {
  [index: string]: any;
}

const nums: IIndexType = ["abc", "cba", "nba"]
// 通过数字类型访问索引时, 最终都是转化成string类型访问
const num1 = nums[0]
console.log(num1)

const info: IIndexType = { name: "张三", age: 18 }
const name = info["name"]
console.log(name)

export {}